package com.atguigu.springcloud.controller;

import com.atguigu.springcloud.compute.MyLB;
import com.atguigu.springcloud.entities.CommonResult;
import com.atguigu.springcloud.entities.Payment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;


/*
* 这是基于客户端的controller
* 因此都使用get方式的请求
* */
@Slf4j
@RestController
public class OrderController {

    /*
    * 既然已经使用了支付服务的集群模式
    * 也开启了服务注册中心
    * 那么在发送请求时就不能使用固定的端口号了(使用服务的名称)
    * 并且要开启restTemplate的负载均衡的功能，让它知道怎样去调用服务集群(默认采用轮询的方式)
    * CLOUD-PAYMENT-SERVICE
    * CLOUD-PAYMENT-SERVICE
    * */
    //public static final String ORDER_URL="http://localhost:8001";
    public static final String ORDER_URL="http://CLOUD-PAYMENT-SERVICE";
    /*restTemplate是基于restful风格的客户端 主要与服务器产生http通讯
    * 老的客户端一般是使用HttpClient
    * */
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private MyLB myLB;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult consumerGet(@PathVariable int id){
        /*注意：CommonResult.class这个参数的是作为返回值来使用的
        * 形参这里填写什么，那么该方法返回值就是什么
        * */
        return restTemplate.getForObject(ORDER_URL+"/payment/get/"+id,CommonResult.class);
    }

    /*这里形参不加@RequestBody，那么形参直接和?后的query参数直接绑定*/
    @GetMapping("/consumer/payment/insert")
    public CommonResult consumerCreate(Payment payment){
        /*注意：CommonResult.class这个参数的是作为返回值来使用的
         * 形参这里填写什么，那么该方法返回值就是什么
         * 注意：restTemplate发送的数据会转为json格式，因此接收的形参前要加@RequestBody
         * */
        return restTemplate.postForObject(ORDER_URL+"/payment/insert",payment,CommonResult.class);
    }

    @GetMapping("/consumer/payment/lb")
    public String getPortlb(){
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        ServiceInstance serviceInstance=myLB.getServices(instances);
        String URL=serviceInstance.getUri().toString();
        return restTemplate.getForObject(URL+"/payment/lb",String.class);
    }

}
